package com.xneure.utils.cipher;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;

/**
 * AES对称秘钥算法加密。
 *
 */
public class AESCoder {

	public static final String KEY_ALGORITHM = "AES";
	// 算法/模式/填充
	// 16字节加密后数据长度 不满16字节加密后长度
	// AES/CBC/NoPadding
	// 16
	// 不支持
	// AES/CBC/PKCS5Padding
	// 32
	// 16
	// AES/CBC/ISO10126Padding
	// 32
	// 16
	// AES/CFB/NoPadding
	// 16
	// 原始数据长度
	// AES/CFB/PKCS5Padding
	// 32
	// 16
	// AES/CFB/ISO10126Padding
	// 32
	// 16
	// AES/ECB/NoPadding
	// 16
	// 不支持
	// AES/ECB/PKCS5Padding
	// 32
	// 16
	// AES/ECB/ISO10126Padding
	// 32
	// 16
	// AES/OFB/NoPadding
	// 16
	// 原始数据长度
	// AES/OFB/PKCS5Padding
	// 32
	// 16
	// AES/OFB/ISO10126Padding
	// 32
	// 16
	// AES/PCBC/NoPadding
	// 16
	// 不支持
	// AES/PCBC/PKCS5Padding
	// 32
	// 16
	// AES/PCBC/ISO10126Padding
	// 32
	// 16
	public static String CIPER_ALGORITHM = "AES/ECB/PKCS5Padding";

	public static byte[] decrept(byte[] data, String key) throws Exception {
		Cipher cipher = Cipher.getInstance(CIPER_ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, initKey(key));
		return cipher.doFinal(SimpleEncode.decodeBase64(new String(data)));
	}

	public static byte[] encrept(byte[] data, String key) throws Exception {
		Cipher cipher = Cipher.getInstance(CIPER_ALGORITHM);
		cipher.init(Cipher.ENCRYPT_MODE, initKey(key));
		return SimpleEncode.encodeBase64(cipher.doFinal(data)).getBytes();
	}

	private static Key initKey(String pwd) throws Exception {
		KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
		if (null == pwd) {
			kg.init(128);
		} else {
			SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
			random.setSeed(pwd.getBytes());
			kg.init(128, random);
		}
		return new SecretKeySpec(kg.generateKey().getEncoded(), "AES");
	}

}
